home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_300
/
359_11
/
patch5.000
/
GO32_DEBUG.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-09-11
|
19KB
|
728 lines
/* This is file DEBUG.C */
/*
** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
**
** This file is distributed under the terms listed in the document
** "copying.dj", available from DJ Delorie at the address above.
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
/* History:175,26 */
#include <stdio.h>
#include <setjmp.h>
#include <math.h>
#include <dos.h>
#include "build.h"
#include "types.h"
#include "gdt.h"
#include "tss.h"
#include "utils.h"
#include "unassmbl.h"
#include "syms.h"
#include "paging.h"
#include "npx.h"
#include "mono.h"
extern int was_exception, have_80387;
jmp_buf back_to_debugger;
int can_longjmp=0;
#if DEBUGGER
extern word32 dr[8];
extern word32 dr0, dr1, dr2, dr3, dr6, dr7;
typedef struct {
char *cp;
int t;
} item;
my_getline(char *buf, char *lasttoken)
{
int idx, i, ch;
if (use_ansi)
printf("\033[0;32m");
mono_attr = MONO_NORMAL;
printf(">> %s", lasttoken);
for (i=0; lasttoken[i]; i++)
mputchar(8);
while (!bioskey(1));
for (i=0; lasttoken[i]; i++)
mputchar(' ');
for (i=0; lasttoken[i]; i++)
mputchar(8);
idx = 0;
if (use_ansi)
printf("\033[1;33m");
mono_attr = MONO_BOLD;
while (1)
{
ch = bioskey(0) & 0xff;
switch (ch)
{
case 10:
case 13:
buf[idx] = 0;
if (!idx && lasttoken[0])
printf("\r \r");
else
mputchar('\n');
if (use_ansi)
printf("\033[0m");
mono_attr = MONO_NORMAL;
return;
case 27:
while (idx)
{
printf("\b \b");
idx--;
}
break;
case 8:
if (idx)
{
printf("\b \b");
idx--;
}
break;
default:
mputchar(ch);
buf[idx++] = ch;
break;
}
}
}
typedef enum { Zero, Unknown, CONT, STEP, NEXT, REGS, SET, HELP, LIST,
DUMP, QUIT, BREAK, STATUS, WHERE, DUMP_A, DUMP_B, DUMP_W, WHEREIS, XNPX,
CLS };
extern struct {
char *name;
int size;
int ofs;
} regs[];
item cmds[] = {
"g", CONT,
"go", CONT,
"cont", CONT,
"c", CONT,
"step", STEP,
"s", STEP,
"next", NEXT,
"n", NEXT,
"regs", REGS,
"r", REGS,
"set", SET,
"help", HELP,
"h", HELP,
"?", HELP,
"list", LIST,
"l", LIST,
"u", LIST,
"dump", DUMP,
"d", DUMP,
"da", DUMP_A,
"db", DUMP_B,
"dw", DUMP_W,
"dd", DUMP,
"quit", QUIT,
"q", QUIT,
"break", BREAK,
"b", BREAK,
"status", STATUS,
"where", WHERE,
"whereis", WHEREIS,
"npx", XNPX,
"cls", CLS,
0, 0
};
extern int debug_mode;
debugger()
{
char buf[140], token[10];
char buf2[140], *name, lasttoken[140];
int i, n, s, len, rem_cmd, cmd, vstep, found;
word32 vaddr, v, rem_v, olddr7;
int32 delta;
dr0 = dr1 = dr2 = ARENA;
dr3 = syms_name2val("_main") + ARENA;
if (undefined_symbol)
dr3 = tss_ptr->tss_eip + ARENA;
rem_cmd = Zero;
lasttoken[0] = 0;
setjmp(back_to_debugger);
can_longjmp = 1;
while (1)
{
if (debug_mode)
{
int found;
my_getline(buf, lasttoken);
token[0] = 0;
if (sscanf(buf, "%s %[^\n]", token, buf) < 2)
buf[0] = 0;
if (token[0])
strcpy(lasttoken, token);
cmd = rem_cmd;
found = 0;
for (i=0; cmds[i].cp; i++)
if (strcmp(cmds[i].cp, token) == 0)
{
cmd = cmds[i].t;
found = 1;
}
if (!found && token[0])
cmd = Unknown;
if (rem_cmd != cmd)
vaddr = tss_ptr->tss_eip;
}
else
{
cmd = CONT;
debug_mode = 1;
}
switch (cmd)
{
case HELP:
printf("Commands:\n");
printf("go <v>\tg\tgo, stop at <v>\n");
printf("cont\tc\tcontinue execution\n");
printf("step\ts\tstep through current instruction\n");
printf("next\tn\tstep to next instruction\n");
printf("list\tl u\tlist instructions (takes addr, count)\n");
printf("dump\td\tdump memory (takes addr, count)\n");
printf("break\tb\tset breakpoint (takes which, addr)\n");
printf("status\t\tbreakpoint status\n");
printf("regs\tr\tprint registers\n");
printf("set\t\tset register/memory\n");
printf("npx\t\tdisplay 80387 contents\n");
printf("where\t\tdisplay list of active functions\n");
printf("whereis\t\tfind a symbol/location (takes wildcard or value)\n");
printf("cls\t\tclear screen\n");
printf("help\th,?\tprint help\n");
printf("quit\tq\tquit\n");
break;
case CONT:
sscanf(buf, "%s", buf);
if (buf[0])
{
v = syms_name2val(buf);
if (undefined_symbol)
break;
dr3 = v+ARENA;
dr7 |= 0xc0;
}
else
dr7 &= ~0xc0;
olddr7 = dr7;
dr7 = 0;
tss_ptr->tss_eflags |= 0x0100;
go_til_stop();
dr7 = olddr7;
if (tss_ptr->tss_irqn == 1)
{
tss_ptr->tss_eflags &= ~0x0100;
tss_ptr->tss_eflags |= 0x10000;
go_til_stop();
if (tss_ptr->tss_irqn == 1)
tssprint(tss_ptr);
}
print_reason();
dr3 = unassemble(tss_ptr->tss_eip, 1) + ARENA;
break;
case STEP:
if (rem_cmd != cmd)
n = 1;
sscanf(buf, "%d", &n);
tss_ptr->tss_eflags |= 0x0100;
for (i=0; i<n; i++)
{
olddr7 = dr7;
dr7 = 0;
go_til_stop();
dr7 = olddr7;
print_reason();
dr3 = unassemble(tss_ptr->tss_eip, 1) + ARENA;
if (tss_ptr->tss_irqn != 1)
break;
}
tss_ptr->tss_eflags &= ~0x0100;
break;
case NEXT:
if (rem_cmd != cmd)
n = 1;
sscanf(buf, "%d", &n);
for (i=0; i<n; i++)
{
olddr7 = dr7;
dr7 &= ~0xc0;
dr7 |= 0xc0;
if (last_unassemble_unconditional ||
last_unassemble_jump)
tss_ptr->tss_eflags |= 0x0100; /* step */
else
tss_ptr->tss_eflags &= ~0x0100;
go_til_stop();
dr7 = olddr7;
print_reason();
dr3 = unassemble(tss_ptr->tss_eip, 1) + ARENA;
if (tss_ptr->tss_irqn != 1)
break;
}
tss_ptr->tss_eflags &= ~0x0100;
break;
case WHERE:
v = tss_ptr->tss_ebp;
vaddr = tss_ptr->tss_eip;
printf("0x%08lx %s", vaddr, syms_val2name(vaddr, &delta));
name = syms_val2line(vaddr, &i, 0);
if (name)
printf(", line %d in file %s", i, name);
else if (delta)
printf("%+ld", delta);
mputchar('\n');
do {
if (v == 0)
break;
rem_v = peek32(v+ARENA);
if (rem_v == 0)
break;
vaddr = peek32(v+ARENA+4);
printf("0x%08lx %s", vaddr, syms_val2name(vaddr, &delta));
name = syms_val2line(vaddr, &i, 0);
if (name)
printf(", line %d in file %s", i, name);
else if (delta)
printf("%+ld", delta);
mputchar('\n');
v = rem_v;
} while ((v>=tss_ptr->tss_esp) && (v<0x90000000L));
break;
case WHEREIS:
sscanf(buf, "%s", buf2);
if (strpbrk(buf2, "*?"))
{
syms_listwild(buf2);
break;
}
if (buf2[0])
vaddr = syms_name2val(buf2);
if (undefined_symbol)
break;
name = syms_val2name(vaddr, &delta);
printf("0x%08lx %s", vaddr, name);
if